package com.vtuzx.kingdee.xqc_api.service;

import com.vtuzx.core.VtuzxException;
import com.vtuzx.core.bean.dto.VtuzxMap;
import com.vtuzx.core.bean.dto.VtuzxToken;
import com.vtuzx.core.utils.VtuzxUtil;
import com.vtuzx.web.bean.VtuzxDownloadBean;
import org.bson.Document;
import org.bson.types.ObjectId;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 采购服务
 */
public interface IXqcPurchaseService {

    /**
     * 绑定箱号和RFID
     *
     * @param boxNo 箱号
     * @param rfid RFID
     */
    void bindPurColBoxRfid(String boxNo, String rfid) throws VtuzxException;

    /**
     * 上传采购收货单
     *
     * @param _userId 用户ID
     * @param userName 用户名
     * @param file 文件
     */
    void uploadPurColBill(ObjectId _userId, String userName, File file) throws Exception;

    /**
     * 保存采购收货单
     *
     * @param _userId 用户ID
     * @param param 采购收货单详细
     */
    VtuzxMap savePurColBill(ObjectId _userId, Map<String, Object> param) throws VtuzxException;

    /**
     * 保存采购收货单
     *
     * @param _userId 用户ID
     * @param userName 用户名
     * @param param 采购收货单详细
     */
    VtuzxMap savePurColBill(ObjectId _userId, String userName, Map<String, Object> param) throws VtuzxException;

    /**
     * 删除采购收货单
     *
     * @param _userId 用户ID
     * @param billNo 单号
     */
    void deletePurColBill(ObjectId _userId, String billNo) throws VtuzxException;

    /**
     * 审核采购收货单
     *
     * @param _userId 用户ID
     * @param billNo 单号
     */
    VtuzxMap auditPurColBill(ObjectId _userId, String billNo) throws VtuzxException;

    /**
     * 审核采购收货单
     *
     * @param _userId 用户ID
     * @param userName 用户名
     * @param billNo 单号
     */
    VtuzxMap auditPurColBill(ObjectId _userId, String userName, String billNo) throws VtuzxException;

    /**
     * 反审核采购收货单
     *
     * @param _userId 用户ID
     * @param billNo 单号
     */
    VtuzxMap unauditPurColBill(ObjectId _userId, String billNo) throws VtuzxException;

    /**
     * 根据箱号获取采购收货的物料信息
     *
     * @param boxNo 箱号
     * @return 采购收货的物料信息
     */
    VtuzxMap getPurColMaterial(String boxNo) throws VtuzxException;

    /**
     * 根据RFID获取采购收货的物料信息
     *
     * @param rfidList RFID列表
     * @return 采购收货的物料信息
     */
    VtuzxMap getPurColMaterialByRfid(List<String> rfidList);

    /**
     * 根据箱号获取采购收货的物料信息(绑定RFID专用)
     *
     * @param boxNo 箱号
     * @return 采购收货的物料信息
     */
    VtuzxMap getPurColMaterialForBind(String boxNo) throws VtuzxException;

    /**
     * 获取采购收货单物料列表
     *
     * @param _userId 用户ID
     * @param param 检索条件
     * @param pageIndex 页号
     * @param pageSize 页大小
     * @return 采购收货单物料箱号列表
     */
    VtuzxMap getPurColBill(ObjectId _userId, Map<String, Object> param, int pageIndex, int pageSize);

    /**
     * 获取采购收货单物料列表
     *
     * @param _userId 用户ID
     * @param billNo 单号
     * @return 采购收货单物料箱号列表
     */
    VtuzxMap getPurColBillDetail(ObjectId _userId, String billNo) throws VtuzxException;

    /**
     * 下载采购收货单箱号清单
     *
     * @param _userId 用户ID
     * @param billNo 单号
     * @return 采购收货单箱号清单excel文件
     */
    VtuzxDownloadBean downloadPurColBillBarcode(ObjectId _userId, String billNo) throws Exception;

    /**
     * 下载采购收货单箱号清单
     *
     * @param _userId 用户ID
     * @param billNoList 单号列表
     * @return 采购收货单箱号清单excel文件
     */
    VtuzxDownloadBean downloadPurColBillBarcodeList(ObjectId _userId, List<String> billNoList) throws Exception;

    /**
     * 根据收货单号制作用户采购入库单
     *
     * @param _userId 用户ID
     * @param userName 用户名
     * @param stockNo 仓库编码
     * @param locationNo 仓位编码
     * @param billNoList 单号列表
     */
    void saveUserPurInByPurColList(ObjectId _userId, String userName, String stockNo, String locationNo, List<String> billNoList, String source, boolean isBc) throws Exception;

    /**
     * 保存用户采购入库单
     *
     * @param _userId 用户ID
     * @param userName 用户名
     * @param stockNo 仓库编码
     */
    void saveUserPurIn(ObjectId _userId, String userName, String stockNo, String source, boolean isBc, String orderNo) throws Exception;


    void auditPurInOrder(ObjectId userId, String name, String stockNo, String billNo, String source, boolean isBc) throws VtuzxException;
    /**
     * 添加用户采购入库箱号+数量
     *
     * @param _userId 用户ID
     * @param userName 用户名
     * @param stockNo 仓库编码
     * @param locationNo 仓位编码
     * @param boxNo 箱号
     * @param count 数量
     * @return 添加后物料信息
     */
    VtuzxMap addUserPurInMaterialBox(ObjectId _userId, String userName, String stockNo, String locationNo, String boxNo, double count) throws VtuzxException;

    /**
     * 添加用户采购入库箱号+数量
     *
     * @param _userId 用户ID
     * @param userName 用户名
     * @param stockNo 仓库编码
     * @param locationNo 仓位编码
     * @param boxList 箱号列表
     * @return 添加后物料信息
     */
    VtuzxMap addUserPurInMaterialBoxList(ObjectId _userId, String userName, String stockNo, String locationNo, List<Map<String, Object>> boxList, boolean isBc, String orderNo, String billNo);
    /**
     * 删除用户采购入库单分录
     *
     * @param _userId 用户ID
     * @return 删除后物料信息
     */
    VtuzxMap deleteUserPurInMaterialBox(ObjectId _userId, String id);

    /**
     * 删除用户采购入库单分录
     *
     * @param _userId 用户ID
     */
    void deleteUserPurInMaterial(ObjectId _userId, String id);

    /**
     * 删除用户采购入库单分录箱的重量
     *
     * @param _userId 用户ID
     * @param stockNo 仓库编码
     */
    void deleteUserPurIn(ObjectId _userId, String stockNo);

    /**
     * 更新用户采购入库单分录箱的重量
     *
     * @param _userId 用户ID
     * @param boxNo 物料编码
     * @param count 数量
     * @return 更新后物料信息
     */
    VtuzxMap updateUserPurInMaterialBox(ObjectId _userId, String boxNo, double count);

    /**
     * 获取用户未保存采购入库单分录列表
     *
     * @param _userId 用户ID
     * @param stockNo 仓库编码
     * @return 用户未保存采购入库单分录的箱号列表
     */
    VtuzxMap getUserPurInMaterial(ObjectId _userId, String stockNo, boolean isBc, String orderNo, List<String> excList, String billNo);

    /**
     * 获取用户未保存采购入库单分录的箱号列表
     *
     * @param _userId 用户ID
     * @return 用户未保存采购入库单分录的箱号列表
     */
    VtuzxMap getUserPurInMaterialBox(ObjectId _userId, String id, String billNo);

    /**
     * 获取创建者采购入库单列表
     *
     * @param _userId 用户ID
     * @return 采购入库单列表
     */
    VtuzxMap getPurInBill(ObjectId _userId, int pageIndex, int pageSize, Map<String, Object> param);

    /**
     * 获取创建者采购入库单列表
     *
     * @param _userId 用户ID
     * @return 采购入库单列表BN
     */
    VtuzxMap getPurInBillBn(ObjectId _userId, int pageIndex, int pageSize, Map<String, Object> param);

    /**
     * 获取创建者采购入库单分录
     *
     * @param _userId 用户ID
     * @param stockNo 仓库编码
     * @param stockInBillNo 采购入库单号
     * @return 采购入库单分录
     */
    VtuzxMap getPurInBillDetail(ObjectId _userId, String stockNo, String stockInBillNo);

    /**
     * 获取创建者采购入库单分录BN
     *
     * @param _userId 用户ID
     * @param stockNo 仓库编码
     * @param stockInBillNo 采购入库单号
     * @return 采购入库单分录
     */
    VtuzxMap getPurInBillDetailBn(ObjectId _userId, String stockNo, String stockInBillNo);

    /**
     * 获取创建者采购入库单分录的箱号列表
     *
     * @return 采购入库单分录的箱号列表
     */
    VtuzxMap getPurInBillDetailBox(ObjectId _userId, String _detailId);

    /**
     * 查询已创建包材采购入库单列表
     * @param userId
     * @param orderNo
     * @return
     */
    VtuzxMap getCreatedBcPurInList(ObjectId userId, String orderNo);

    /**
     * 根据采购入库单号获取详情
     * @param userId
     * @param
     * @return
     */
    VtuzxMap getPurInBillByBillNo(ObjectId userId, String billNo)throws VtuzxException ;

    /**
     * 生成采购退货单
     * @param userId
     * @param param
     * @return
     */
    void addPurReturn(String name, ObjectId userId, Map<String, Object> param)throws Exception ;

    /**
     * 获取采购退料单列表
     * @param userId
     * @param pageIndex
     * @param pageSize
     * @param param
     * @return
     */
    VtuzxMap getPurReturnBill(ObjectId userId, int pageIndex, int pageSize, Map<String, Object> param);

    /**
     * 获取采购退料的详情
     * @param userId
     * @return
     */
    VtuzxMap getPurReturnByBillNo(ObjectId userId, String billNo);

    VtuzxDownloadBean downloadPurInList(VtuzxToken token, Map<String, Object> param) throws Exception;


}
